package com.jian.java;

import org.junit.Test;

import java.io.*;
import java.sql.*;
import java.util.Properties;

/**
 * @author Jiange
 * @create 2021-04-04-14:05
 * 数据一旦提交就不能回滚
 * DDL会自动提交  DML 默认情况下也会 在关闭连接的时候也会自动提交数据
 *  ACID
 *  A:原子性 事务中的操作要么都不发生 要不都发生
 *  C:一致性 事务中的数据必须从一个状态变到另一个状态
 *  I：隔离性 执行的各个事务之间不能互相干扰
 *  D：持久性 数据改变时永久性的
 *  脏读：一个事务读取了另一个事务更新但是还没有提交的数据
 *  不可重复读： 一个事务读取了一个字段 连接还没断时 另一个事务更改了数据并且做了提交 第一个事务再次读取的时候数据变了
 *  幻读就是不可重复读变成行
 *  Mysql的默认事务的隔离级别是 repeatable read 可重复读
 */
public class TransactionTest {
    @Test
    public void test1() throws Exception {
        InputStream inputStream = new FileInputStream("JDBC.properties");
        Properties properties = new Properties();
        properties.load(inputStream);

        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driverClass = properties.getProperty("driverClass");

        Class.forName(driverClass);

        Connection connection = DriverManager.getConnection(url, user, password);
        connection.setAutoCommit(false);
        int transactionIsolation = connection.getTransactionIsolation();//获取当前事物的隔离级别1 2 4 8
        System.out.println(transactionIsolation);
        connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
//        connection.rollback();数据回滚

        String select="select * from students";
        connection.prepareStatement(select);
    }

    @Test
    public void test2() throws SQLException, IOException {
        Driver driver = new com.mysql.cj.jdbc.Driver();
        Properties properties = new Properties();
        properties.setProperty("username","root");
        properties.setProperty("password","123456");
        Connection connect = driver.connect("jdbc://mysql/test", properties);
        PreparedStatement preparedStatement = connect.prepareStatement("");
        ResultSet resultSet = preparedStatement.executeQuery();
        ResultSetMetaData metaData = resultSet.getMetaData();
        Blob blob = resultSet.getBlob(1);
        InputStream binaryStream = blob.getBinaryStream();
        byte[] bytes = binaryStream.readAllBytes();
        FileOutputStream outputStream = new FileOutputStream("lai");
        outputStream.write(bytes);
    }
}
